package com.zp.reflection;

import java.lang.reflect.Method;

public class ReflectTest2 {
	
	public int add(int a,int b){
		return a + b;
	}
	
	public String getString(String message){
		return message;
	}
	
	public static void main(String[] args) throws Exception {
		//这是普通的调用对象的方法：
		ReflectTest2 test = new ReflectTest2();
		int c = test.add(1,2);
		String str = test.getString("zhangpeng");
		System.out.println(c+"; "+str);
		
		//下面是用反射机制来调用方法的：
		//a)获得目标类的class对象的二种方法；
		Class<?> classType = ReflectTest2.class;
		//b)获取目标类的一个实例(创建一个对象)；
		Object instance = classType.newInstance();
		
		//c)获取目标类的方法(获取指定方法)：根据方法名和该方法参数的class对象的的集合；
		//由于方法的重载，必须根据方法名和参数类型才能确定；
		Method addMethod = classType.getMethod("add",new Class[]{int.class,int.class});
		//d)调用指定方法：根据目标类的实例和该方法的参数数组，为instance这个实例存放数据；
		Object addResult = addMethod.invoke(instance,new Object[]{1,2});
		System.out.println((Integer)addResult);
		
		Method stringMethod = classType.getMethod("getString",new Class[]{String.class});
		Object stringResult = stringMethod.invoke(instance,new Object[]{"zhangpeng"});
		System.out.println((String)stringResult);
	}
}
